package com.sjc.designpattern.chain;

/**
 * @Classname ChainPatternDemo
 * @Description 责任链模式：动态组装不同的复杂业务流程
 * chain of responsibility模式场景
 * 1. 现在在某一个地方的业务流程，要执行功能1、功能2、功能3
 * 2. 现在在另外一个地方的业务流程，是要先执行功能3，然后执行功能1和功能2
 * @Date 2020/4/26 13:44
 * @Created by SangJiacun
 */
public class ChainPatternDemo {

    public static void main(String[] args) {

        Handler3 handler3 = new Handler3(null);
        Handler2 handler2 = new Handler2(handler3);
        Handler1 handler1 = new Handler1(handler2);
        handler1.execute();

        handler2 = new Handler2(null);
        handler1 = new Handler1(handler2);
        handler3 = new Handler3(handler1);
        handler3.execute();

        // 责任链的思想
        // 1：将一个业务流程中的多个步骤拆分开来，每个步骤封装到一个handler处理器中去
        // 2：支持业务流程基于handler动态组装，不同的业务流程 -> handler代表的代码组件可以复用

        // 好处1：将这个代码封装到一个handler中，后面如果要对某个步骤的代码逻辑调整，修改一个handler即可
        // 好处2：如果业务流程要修改，那么不需要拷贝大量的代码，只要基于handler动态组装业务流程即可

        // 面向的场景
        // 就是有多个业务流程，这些业务流程之间有相同的代码逻辑和步骤，可以用责任链模式来实现
    }

    public static abstract class Handler{
        protected  Handler successor;

        public Handler(Handler successor) {
            this.successor = successor;
        }

        public abstract void execute();
    }

    public static class Handler1 extends Handler{
        public Handler1(Handler successor) {
            super(successor);
        }

        @Override
        public void execute() {
            System.out.println("执行功能1");
            if(null != successor){
                successor.execute();
            }
        }
    }

    public static class Handler2 extends Handler{
        public Handler2(Handler successor) {
            super(successor);
        }

        @Override
        public void execute() {
            System.out.println("执行功能2");
            if(null != successor){
                successor.execute();
            }
        }
    }

    public static class Handler3 extends Handler{
        public Handler3(Handler successor) {
            super(successor);
        }

        @Override
        public void execute() {
            System.out.println("执行功能3");
            if(null != successor){
                successor.execute();
            }
        }
    }
}
